/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package cliente.negocio;

import cliente.comunicacion.Proxy;
import cliente.presentacion.administrador.Horas.JF_CalendariosAdmin;
import cliente.presentacion.administrador.Horas.iJF_CalendariosAdmin;


import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import server.dominio.Hora;
import server.dominio.Medico;
import server.excepciones.MedicoInexistenteException;


/**
 *
 * @author tpaxle
 */
public class Controlador_Gestion_Horario implements iControlador_Administrador{
    private Controlador_Administrador C_Administrador;
    private iJF_CalendariosAdmin ventana_horario;
    private Proxy proxy;

    private boolean actualizado= false;
    private ArrayList<Object> listahorario;
    private Medico medicoseleccionado=null;
    DateFormat formateadorfecha;
    private ArrayList<Object> listamedicos;
    private boolean [] pedido= {false, false};
    private ArrayList<ArrayList<Intervalo>> dias;
    private ArrayList<ArrayList<Intervalo>> dias_carga;
  

    public Controlador_Gestion_Horario(Controlador_Administrador C_Administrador){
        this.C_Administrador= C_Administrador;
        this.proxy= Proxy.getProxy();
        formateadorfecha= new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
        dias= new ArrayList<ArrayList<Intervalo>>(7);
        dias_carga= new ArrayList<ArrayList<Intervalo>>(7);


        ventana_horario= new JF_CalendariosAdmin(this);
        for(int i=0; i<7; i++){
            dias.add(new ArrayList<Intervalo>());
            dias_carga.add(new ArrayList<Intervalo>());
        }
        obtenemedicos();
    }

    public void pedirhorario(String nif_medico) {
        if(!pedido[0]){
            proxy.pedirhorario(C_Administrador.getIdSesion(), nif_medico);
            pedido[0]=true;
        }
    }

    public void entregarHorario(ArrayList<Object> lhora) {
        listahorario=lhora;
        ArrayList<ArrayList<Integer>> listadatos;
        DateFormat Sacarhora= new SimpleDateFormat("HH");
        Calendar calendar = Calendar.getInstance();
        Hora hora_aux;
        for(int i=0; i< lhora.size(); i++){
            hora_aux= (Hora)lhora.get(i);
            calendar.setTime(hora_aux.getFecha_trabajo());
            int horai= Integer.parseInt(Sacarhora.format(hora_aux.getFecha_trabajo()));
            switch(calendar.get(Calendar.DAY_OF_WEEK)){
                case Calendar.MONDAY:
                    this.insertarintervalo(0, horai, horai+1);
                    break;
                case Calendar.TUESDAY:
                    this.insertarintervalo(1, horai, horai+1);
                    break;
                case Calendar.WEDNESDAY:
                    this.insertarintervalo(2, horai, horai+1);
                    break;
                case Calendar.THURSDAY:
                    this.insertarintervalo(3, horai, horai+1);
                    break;
                case Calendar.FRIDAY:
                    this.insertarintervalo(4, horai, horai+1);
                    break;
                case Calendar.SATURDAY:
                    this.insertarintervalo(5, horai, horai+1);
                    break;
                case Calendar.SUNDAY:
                    this.insertarintervalo(6, horai, horai+1);
                    break;
            }
        }
        ventana_horario.activarhorariomedico(dias);
    }

   

    public Vector<String> getmedicoad(int nmedico) {
         Vector<String> datos;
        datos= new Vector<String>(5);

        medicoseleccionado= (Medico) listamedicos.get(nmedico);
        datos.add(medicoseleccionado.getNif());
        datos.add(medicoseleccionado.getApellidos());
        datos.add(medicoseleccionado.getNombre());
        datos.add(""+medicoseleccionado.getTeleFijo());
        datos.add(""+medicoseleccionado.getTipo_medico());
        return datos;
    }

    public boolean insertarintervalo(int dia, int desde, int hasta) {
        boolean valido= true;
        Intervalo intervalo= new Intervalo(desde, hasta);
        ArrayList<Intervalo> listaintervalodia= (ArrayList<Intervalo>) dias.get(dia);
        for(Intervalo I: listaintervalodia){
            if(I.intersectan(intervalo))
                valido= false;
        }
        if(valido){
            listaintervalodia.add(intervalo);
        }
        return valido;
    }

   

  
    public boolean insertarintervalo(ArrayList<Intervalo> lista, Intervalo intervalo) {
        boolean valido= true;

        ArrayList<Intervalo> listaintervalodia= lista;
        for(Intervalo I: listaintervalodia){
            if(I.intersectan(intervalo))
                valido= false;
        }
        if(valido){
            listaintervalodia.add(intervalo);
        }
        return valido;
    }

    public void guardardatos() {
        try {
            Vector<Date> fechas = new Vector<Date>();
            ArrayList<Vector<java.util.Date>> fecha_Vdias = new ArrayList<Vector<java.util.Date>>();
            for (int i = 0; i < 7; i++) {
                fecha_Vdias.add(new Vector<java.util.Date>());
            }


            //Establece un vector con dias de la semana inicializacion
            for (int i = 0; i < 7; i++) {
                Calendar calendar = Calendar.getInstance();
                calendar.add(Calendar.DAY_OF_YEAR, 1);
                while (calendar.get(Calendar.DAY_OF_WEEK) != (i + 1)) {
                    calendar.add(Calendar.DAY_OF_YEAR, 1);
                }
                //Tenemos el primer dia x (lunes, martes, miercoles, jueves, viernes)
                switch (i) {
                    case 0:
                        //Si es domingo
                        for (int diasemana = 0; diasemana < 10; diasemana++) {
                            calendar.set(Calendar.MINUTE, 0);
                            fecha_Vdias.get(6).add((java.util.Date) calendar.getTime());
                            calendar.add(Calendar.DAY_OF_YEAR, 7);
                        }
                        break;
                    default:
                        //Si es domingo
                        for (int diasemana = 0; diasemana < 10; diasemana++) {
                            calendar.set(Calendar.MINUTE, 0);
                            fecha_Vdias.get(i - 1).add((java.util.Date) calendar.getTime());
                            calendar.add(Calendar.DAY_OF_YEAR, 7);
                        }
                }
            }
            medicoseleccionado = proxy.getMedico(C_Administrador.getIdSesion(), medicoseleccionado.getNif());
            Calendar hora_desde = Calendar.getInstance();
            Calendar hora_hasta = Calendar.getInstance();
            proxy.refrescarCalendario(C_Administrador.getIdSesion(), medicoseleccionado);



            for (int ndias = 0; ndias < dias.size(); ndias++) {
                for (Intervalo I : dias.get(ndias)) {
                    hora_desde = Calendar.getInstance();
                    hora_desde.setTime(fecha_Vdias.get(ndias).get(0));
                    hora_desde.set(Calendar.HOUR_OF_DAY, I.getDesde());
                    hora_desde.set(Calendar.MINUTE, 0);
                    hora_desde.set(Calendar.SECOND, 0);
                    hora_hasta = Calendar.getInstance();
                    hora_hasta.setTime(fecha_Vdias.get(ndias).get(0));
                    hora_hasta.set(Calendar.HOUR_OF_DAY, I.getHasta());
                    hora_hasta.set(Calendar.MINUTE, 0);
                    hora_hasta.set(Calendar.SECOND, 0);
                    proxy.modificarCalendario(C_Administrador.getIdSesion(), medicoseleccionado, fecha_Vdias.get(ndias), hora_desde.getTime(), hora_hasta.getTime());

                }
            }
            pedido[0]= false;


        } catch (MedicoInexistenteException ex) {
              C_Administrador.getAdmin_Control().log("El medico especificado ya no existe " + ex);
        } catch (Exception ex) {
            Logger.getLogger(Controlador_Gestion_Horario.class.getName()).log(Level.SEVERE, null, ex);
        }
        
    }


    public void eliminar(String dia, int desde, int hasta) {
        //Buscar que dia es el lunes
        int ndia=-1;
        if(dia.equals("Lunes"))
            ndia=0;
        if(dia.equals("Martes"))
            ndia=1;
        if(dia.equals("Miercoles"))
            ndia=2;
        if(dia.equals("Jueves"))
            ndia=3;
        if(dia.equals("Viernes"))
            ndia=4;
        if(dia.equals("Sabado"))
            ndia=5;
        if(dia.equals("Domingo"))
            ndia=6;
        Intervalo borrar= null;
        for(Intervalo inter: dias.get(ndia)){
            if(inter.getDesde()== desde && inter.getHasta()== hasta){
                borrar= inter;
                break;
            }
        }
        dias.get(ndia).remove(borrar);
    }

    public void notificar(int noperacion, Object objeto) {
        switch(noperacion){
            case 7:
                if(medicoseleccionado!= null && medicoseleccionado.getNif().equals(objeto) && !actualizado){
                    actualizado= true;
                    ventana_horario.error(1);
                }
                break;
            case 2:
                if(objeto instanceof Medico && ((Medico)objeto).getNif().equals(medicoseleccionado.getNif())){
                      //Han eliminado el medico mientras alguien lo esta editando
                    ventana_horario.error(2);
                 }
                break;
            case 8:
                //Borrado
                if(medicoseleccionado!= null && medicoseleccionado.getNif().equals(objeto)){
                      //Han eliminado el medico mientras alguien lo esta editando
                    listahorario.clear();
                    ventana_horario.borrar();
                 }
                break;
        }

    }

    public void entregarUsuariosrecibidos(ArrayList<Object> usuarios, ArrayList<Object> beneficiarios) {
         //Se descarta
    }

    public void entregarCentros(ArrayList<Object> centros) {
        //Se descarga
    }

    public void entregarMedicos(ArrayList<Object> medicos) {
        listamedicos= medicos;
        mostrarmedicos();
    }


    private void obtenemedicos() {
        actualizado= false;
        proxy.getMedicos(C_Administrador.getIdSesion());
    }

    private void mostrarmedicos() {
        Medico m= null;
        ArrayList<String> informacion_medicos = new ArrayList<String>();
        for(Object medico: listamedicos){
            m= (Medico)medico;
            informacion_medicos.add(m.getNif() + "     " + m.getNombre() + "    " + m.getApellidos() + "         " + m.getTeleFijo() + "           " + m.getTipo_medico());
        }
        ventana_horario.iniciarmedicos(informacion_medicos);
    }

    public void cerrar() {
        C_Administrador.cerrar();
    }

    public void iniciarcalendario(Date date) {
        //Se busca las horas de trabajo de un dia determinado
       DateFormat formateadorDia= new SimpleDateFormat("dd/MM/yyyy");
       DateFormat formateadorhora= new SimpleDateFormat("HH");
       Hora hora_aux=null;
       boolean [] datos_tabla= new boolean[13];
       int hora_fecha;
       for(Object hora: listahorario){
           hora_aux= (Hora)hora;
           if(formateadorDia.format(hora_aux.getFecha_trabajo()).equals(formateadorDia.format(date))){
               //Obtenemos la hora
               hora_fecha= Integer.parseInt(formateadorhora.format(hora_aux.getFecha_trabajo()));
               datos_tabla[hora_fecha-8]= true;
           }
       }
       if(datos_tabla!= null){
           ventana_horario.mostrardatoscalendario(datos_tabla);
       }
    }


}
